package org.dllwh.utils.apache.poi.word;

import cn.hutool.core.io.FileUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBackground;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageSz;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;

import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;

/**
 * 把今天最好的表现当作明天最新的起点．．～
 * <p>
 * Today the best performance as tomorrow the newest starter!
 *
 * @ClassName WordDocumentHelper
 * @Description Word 文档处理工具类
 * @Date 2025-10-24 13:41
 * @版本 V 1.0.1
 * @since JDK 17
 */
public final class WordDocument {
    /**
     * 创建word文档
     */
    public static XWPFDocument createDocument() {
        return new XWPFDocument();
    }

    /**
     * 打开word文档
     *
     * @param path word文档所在路径
     */
    public static XWPFDocument openDocument(String path) throws IOException {
        return new XWPFDocument(FileUtil.getInputStream(path));
    }    

    /**
     * 保存文档
     *
     * @param document     word文档
     * @param fileSavePath 保存路径
     */
    public static void saveDocument(XWPFDocument document, String fileSavePath) throws IOException {
        // 判断生成目录是否存在，不存在时创建目录
        FileUtil.mkParentDirs(fileSavePath);
        // 通过传入一个OutStream，将文档写入流
        FileOutputStream fileOutputStream = new FileOutputStream(fileSavePath);
        document.write(fileOutputStream);
        fileOutputStream.close();
        document.close();
    }

    /**
     * 设置word文档的背景色
     *
     * @param document word文档
     * @param bgColor  背景色
     */
    public static void setDocumentBackground(XWPFDocument document, String bgColor) {
        CTBackground bg = document.getDocument().isSetBackground() ? document
                .getDocument().getBackground() : document.getDocument()
                .addNewBackground();
        bg.setColor(bgColor);
    }

    /**
     * 设置纸张大小
     *
     * @param document word文档
     * @param width    宽度
     * @param height   高度
     */
    public static void setPageSize(XWPFDocument document, long width, long height) {
        CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
        CTPageSz pgsz = sectPr.isSetPgSz() ? sectPr.getPgSz() : sectPr.addNewPgSz();
        pgsz.setW(BigInteger.valueOf(width));
        pgsz.setH(BigInteger.valueOf(height));
    }

    /**
     * 设置页边距
     *
     * @param document word文档
     * @param top      顶部边距，单位：厘米
     * @param bottom   底部边距，单位：厘米
     * @param left     左边距，单位：厘米
     * @param right    右边距，单位：厘米
     */
    public static void setPageMargin(XWPFDocument document, double top, double bottom, double left, double right) {
        // 获取文档的第一个节区属性
        CTSectPr sectPr = document.getDocument().getBody().getSectPr();
        // 如果不存在则创建
        if (sectPr == null) {
            sectPr = document.getDocument().getBody().addNewSectPr();
        }
        CTPageMar pgMar = sectPr.isSetPgMar() ? sectPr.getPgMar() : sectPr.addNewPgMar();
        // 设置页面边距 (厘米转换为twips，1cm = 567 twips)
        pgMar.setTop(BigInteger.valueOf(Math.round(top * 567)));
        pgMar.setBottom(BigInteger.valueOf(Math.round(bottom * 567)));
        pgMar.setLeft(BigInteger.valueOf(Math.round(left * 567)));
        pgMar.setRight(BigInteger.valueOf(Math.round(right * 567)));
    }
}

